package demo.reflect;

import lombok.extern.slf4j.Slf4j;

/**
 * @author zhanghaixuan
 * @date 2020-03-05 10:37
 */
@Slf4j
public class ReflectTarget extends ReflectTargetOrigin{
    /**
     * 默认构造函数
     */
    ReflectTarget(String str) {
        log.info("默认构造函数,{}",str);
    }

    /**
     * 无参构造函数
     */
    public ReflectTarget(){
        log.info("public构造函数");
    }

    /**
     * 有一个参数的构造函数
     */
    public ReflectTarget(char name){
        log.info("调用了一个参数的构造函数,{}",name);
    }

    /**
     * 多个参数的构造函数
     */
    public ReflectTarget(String name,int index){
        log.info("调用了多参数的构造函数,{},{}",name,index);
    }

    /**
     * 受保护的构造方法
     */
    protected ReflectTarget(boolean name){
        log.info("调用了受保护的构造方法,{}",name);
    }

    /**
     * 私有的构造方法
     */
    private ReflectTarget(int i){
        log.info("调用了私有的构造方法,{}",i);
    }

    //**************字段*******************//
    public String name;
    protected int index;
    char type;
    private String targetInfo;
    @Override
    public String toString(){
        return "ReflectTarget [name=" + name + ", index=" + index + ", type=" + type
                + ", targetInfo=" + targetInfo + "]";
    }

    //***************成员方法***************//
    public void show1(String s){
        System.out.println("调用了公有的，String参数的show1(): s = " + s);
    }
    protected void show2(){
        System.out.println("调用了受保护的，无参的show2()");
    }
    void show3(){
        System.out.println("调用了默认的，无参的show3()");
    }
    private String show4(int index){
        System.out.println("调用了私有的，并且有返回值的，int参数的show4(): index = " + index);
        return "show4result";
    }

    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式获取class对象
        ReflectTarget reflectTarget = new ReflectTarget();
        final Class<? extends ReflectTarget> reflectTarget1 = reflectTarget.getClass();
        log.info("1st:{}",reflectTarget1.getName());
        //第二种方式获取Class对象
        Class<ReflectTarget> reflectTarget2 = ReflectTarget.class;
        log.info("2nd:{}",reflectTarget2.getName());
        log.info("第一种和第二种对比:{}",reflectTarget1==reflectTarget2);
        //第三种获取方式
        Class<?> reflectTarget3 = Class.forName("demo.reflect.ReflectTarget");
        log.info("3rd:{}",reflectTarget3.getName());
        log.info("第二种和第三种对比:{}",reflectTarget2==reflectTarget3);
    }
}
